iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
Python

30 天學會用 Python pandas 和 openpyxl 處理 Excel —— 成為用 Python 處理 Excel 檔案的高手系列 第 20

Python 使用 openpyxl 設定 Excel 儲存格格式【Python 處理 Excel #20】

  • 分享至 

  • xImage
  •  

本篇文章同步發布於 Python 使用 openpyxl 設定 Excel 儲存格格式【Python 處理 Excel #20】

前言

學會將 Python pandas 的 DataFrame 輸出到 Excel 檔案以後,有好一段時間我都會在輸出檔案以後打開檔案用滑鼠一一後把日期相關的欄位格式改為 Excel 的簡短日期,或是把 ID 相關的欄位格式通通設定為文字。

Excel 的巨集可以縮短調整格式的時間,不過某天學會直接用 openpyxl 在輸出 Excel 檔案前針對特定的欄位們設定格式,打開輸出的 Excel 檔案看見漂漂亮亮、不需要再調整的內容,心情無比美麗。這篇文章分享在 Python 中如何使用 openpyxl 設定 Excel 的儲存格格式。


如何建立或取得指定名稱的儲存格格式?

用 openpyxl 設定活頁簿的儲存格格式以前,需要先建立儲存格格式本身。所謂「儲存格格式本身」對應到 Excel 檔案的正式名稱是「數字格式代碼」,例如「@」符號在 Excel 代表的是文字格式、「yyyy」代表的是年度的格式等。數字格式代碼也可以用來控制儲存格值的顏色、小數點位數、空格等條件。

openpyxl 透過其下的 NamedStyle 類別建立和管理 Excel 工作表中的儲存格格式,並且賦予一個唯一的名稱,方便在活頁簿中重複使用。NamedStyle 除了用於定義儲存格的數字格式代碼,也可以定義對齊方式、字體、邊框等各種 Excel 常見的格式化選項。

下方是建立或取得特定名稱的格式的程式碼:

from openpyxl.styles import NamedStyle

def create_excel_style(wb, style_name, number_format):
    """
    在指定的活頁簿中建立或取得指定名稱的格式。

    參數:
    wb (Workbook): 要操作的活頁簿物件。
    style_name (str): 格式的名稱。
    number_format (str): 格式的數字格式。

    返回:
    NamedStyle: 新建立或既有的格式。
    """
    # 檢查格式是否已經存在
    if style_name in wb.named_styles:
        return wb.named_styles[style_name]
    
    # 建立新的樣式
    new_style = NamedStyle(name=style_name, number_format=number_format)
    wb.add_named_style(new_style)
    return new_style

解釋

  • wb.named_styles:此屬性包含了活頁簿中所有已命名的格式。透過檢查是否已有同名稱的式,可以避免重複建立相同名稱的格式。
  • NamedStyle:這個類別允許使用者自訂儲存格的格式。這裡只指定了數字格式 (number_format),但也可以在建立格式時設置更多屬性,如字體、對齊方式等。
  • wb.add_named_style(new_style):將新的格式加入到活頁簿中,以便後續套用到儲存格上。

如何套用不同格式到工作表中的儲存格?

下方程式碼介紹如何將不同的格式套用到工作表中的儲存格:

def apply_excel_styles(wb, ws):
    """
    根據欄位名稱套用不同格式到工作表中的儲存格。

    參數:
    wb (Workbook): openpyxl 的 Workbook 物件。
    ws (Worksheet): openpyxl 的 Worksheet 物件。
    """
    # 建立不同類型的格式
    string_style = create_excel_style(wb, 'string_style', '@')
    date_style = create_excel_style(wb, 'date_style', 'YYYY/MM/DD')
    number_style = create_excel_style(wb, 'number_style', '#,##0;-#,##0')
    
    # 根據欄位名稱套用儲存格樣式
    for col in range(1, ws.max_column + 1):
        header = ws.cell(row=1, column=col).value
        for row in range(2, ws.max_row + 1):
            cell = ws.cell(row=row, column=col)
            if '日期' in header or '交期' in header:
                cell.style = date_style
            elif '數量' in header or '金額' in header:
                cell.style = number_style
            else:
                cell.style = string_style

解釋

  • string_style, date_style, number_style:透過前面建立的 create_excel_style 函數,為字串、日期、數字等資料型別建立了對應的儲存格格式。
  • ws.cell(row, column):這是 openpyxl 用來取得特定儲存格的方式。這裡使用迴圈遍歷工作表中的所有儲存格。
  • 根據欄位名稱 (header),將對應的格式套用到儲存格。這樣能夠確保不同類型的資料有正確的格式,例如以千分位符號分隔數字或金額的儲存格值。

測試用的案例:從建立到套用儲存格格式

最後透過一個測試用的案例介紹如何從頭開始建立 Excel 檔案,並為儲存格套用相對應的格式:

from openpyxl import Workbook

def create_sample_excel():
    """
    建立一個 demo 的 Excel 檔案並套用儲存格格式。
    """
    # 建立活頁簿與工作表
    wb = Workbook()
    ws = wb.active
    ws.title = "demo"
    
    # 增加欄位名稱與資料
    headers = ['訂單編號', '數量', '單價', '總金額', '出貨日期']
    data = [
        ['0001', 100, 10.5, 1050, '2024/09/13'],
        ['0002', 200, 15.0, 3000, '2024/10/01'],
        ['0003', 50, 20.0, 1000, '2024/11/20']
    ]
    
    ws.append(headers)
    for row in data:
        ws.append(row)
    
    # 套用樣式
    apply_excel_styles(wb, ws)
    
    # 儲存 Excel 檔案
    wb.save('styled_example.xlsx')

# 執行案例
if __name__ == "__main__":
    create_sample_excel()

解釋

  • Workbook():建立一個新的 Excel 活頁簿。
  • ws.append(headers) 和 ws.append(row):在工作表中增加欄位名稱和數據列到工作表中。
  • apply_excel_styles(wb, ws):將自訂格式套用到符合條件的儲存格。
  • wb.save('styled_example.xlsx'):將結果儲存為名稱為 styled_example.xlsx 的檔案。

總結

  • 使用 openpyxl 的 NamedStyle 類別可以建立能重複使用的儲存格格式,進而根據欄位名稱或數據類型自動應用不同的儲存格格式。
  • 依據資料類型 (如日期、數字、文字等) 套用不同的儲存格格式可以提高 Excel 檔案內容的可讀性。

本篇文章同步發布於 Python 使用 openpyxl 設定 Excel 儲存格格式【Python 處理 Excel #20】


上一篇
Python 使用 openpyxl 寫入內容到 Excel 儲存格【Python 處理 Excel #19】
下一篇
Python 使用 openpyxl 調整 Excel 欄位寬度【Python 處理 Excel #21】
系列文
30 天學會用 Python pandas 和 openpyxl 處理 Excel —— 成為用 Python 處理 Excel 檔案的高手27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言